home *** CD-ROM | disk | FTP | other *** search
- /*
- * Yamana's Otomeza Plug-in Tool
- * 集中線
- *
- * 1995.08.20
- * 1995.08.27 高速化
- *
- */
- #include "otome_pi.h"
- #include "costbl.h"
- #include "my_hatch.h"
-
- const char longname[] = "DRAW : 集中線";
- int cnfg_max = 4;
- PI_CNFG cnfg[] =
- { /* 1234567890123456 ,min,max,def,set */
- { "線の間隔" , 0, 21, 4, 4 },
- { "線の太さ" , 0, 21, 4, 4 },
- { "集中の方向" , 0, 2, 0, 0 },
- { "濃度" , 0, 11, 0, 0 }
- };
-
- #define USE_ENV PI_SET_ENV
- #define USE_TYPE PI_DRAW_ELLF
-
- #include "otome_pi.c"
-
- /********************************/
-
- #define set_hatch() \
- if( pat-pstep>= minpat ) pat -= pstep ;\
- else pat = minpat;\
- EGB_hatchingPattern( EgbPtr, EGB_PAINTCOL,\
- HATCH_X, HATCH_Y, hatchData[pat] );
-
- /* 外周円弧と内周円弧を計算し描画する */
- /* 扇形を描くより、計算量は増えるが断然速い。*/
- /* 同じ円弧を再計算している点に高速化の余地あり。*/
- #define draw_line() \
- for( j=0; j<256; j+=(size+m) )\
- { p = para+2;\
- for( i=size; i>=0 ; i--,p+=4 )\
- { WORD( p ) = daen->x + (l * cos256( i+j ) >>8 );\
- WORD( p+2 ) = daen->y + (l * sin256( i+j )*rry>>16);\
- }\
- for( i=0; i<=size ; i++,p+=4 )\
- { WORD( p ) = daen->x + ((l-lstep)*cos256( i+j ) >>8 );\
- WORD( p+2 ) = daen->y + ((l-lstep)*sin256( i+j )*rry>>16);\
- }\
- EGB_polygon( EgbPtr, para );\
- }
-
- int consentrate( daen, m, size,mode,pat )
- ELLIPSE *daen;
- int m,size,mode,pat ;
- {
- int r,rry;
- int i,j;
- int l, lstep, pstep;
- int hpat,minpat;
-
- char *para,*p;
-
- if( daen->ry==0 || daen->rx==0 ) return ERROR;
-
- if( (para = (char*)PI_MALLOC( 2+(size+1)*4*2 ))==NULL )
- return PI_ERROR_NO_MEMORY;
-
- hpat = HATCH_MAX - pat ;
- if( !hpat ) return PI_ERROR_ETC;
-
- r = daen->rx;
- rry = daen->ry*256 / daen->rx;
-
- if( r > hpat )
- { lstep = r/hpat;
- pstep = 1;
- }else
- { lstep = 2; /* 濃い色に偏りがちなので */
- pstep = hpat / r * 2 ; /* なるべく小さくなるよう精度を落とす */
- }
- minpat = pat;
- pat = HATCH_MAX + pstep;
- WORD( para ) = (size+1)*2;
- if( size==0 ) m=256;
-
- if( mode==0 ) /* ↓中心部分が描画されないのを防ぐため */
- { for( l=(r/lstep*lstep); l>=lstep; l-=lstep )
- { set_hatch();
- draw_line();
- }
- }else if( mode==1 ) /* ↓外周部分が描画されないのを防ぐ */
- { for( l=lstep; l<=(r+lstep); l+=lstep )
- { set_hatch();
- draw_line();
- }
- }else
- { EGB_hatchingPattern( EgbPtr, EGB_PAINTCOL,\
- HATCH_X, HATCH_Y, hatchData[minpat] );
- l = lstep = r+lstep; /* 外周部対策 */
- draw_line();
- }
-
- PI_FREE( para );
- return NOERR;
- }
-
-
- /********************************/
-
- int APL_exec()
- {
- int line,size,mode,pat;
-
- line = cnfg[0].val * 2;
- size = cnfg[1].val * 2+1;
- mode = cnfg[2].val;
- pat = cnfg[3].val*4;
-
- EGB_writePage ( EgbPtr, PI_PAGE );
- EGB_paintMode ( EgbPtr, EGB_PAINT_HATCHFF );
- EGB_color ( EgbPtr, EGB_PAINTCOL, PI_FORECOL );
-
- return consentrate( (ELLIPSE *)g_para, line, size, mode, pat );
-
- }
-
-